package com.sisgesbyte.web.managedBean.auditoria;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;
import org.primefaces.event.map.OverlaySelectEvent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.common.Validaciones;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.sistema.AuditoriaSistema;
import com.sisgesbyte.services.sistema.bean.AccesoLogResponse;
import com.sisgesbyte.web.beanUtil.UsuarioActivoBean;
import com.sisgesbyte.web.managedBean.common.MantenimientoAbstract;
import com.sisgesbyte.web.managedBean.seguridad.OpcionesControlador;

@ManagedBean
@ViewScoped
public class UsuariosSistemaMBean extends MantenimientoAbstract implements
		Serializable {

	@EJB
	private AuditoriaSistema auditoriaSistema;
	@Inject
	private Validaciones validaciones;
	private MapModel model;
	private Marker marker;
	private static final long serialVersionUID = 1L;
	private List<UsuarioActivoBean> usuariosActivos;
	private List<UsuarioActivoBean> selectedUsuario;
	@ManagedProperty(value = "#{opcionesControlador}")
	private OpcionesControlador opcionesControlador;
	private Boolean detalleSelected;

	@PostConstruct
	private void init() {
		detalleSelected= false;
		inicializar();
	}

	public void inicializar() {
		
		model = new DefaultMapModel();
		
		List<UsuarioActivoBean> buscar = new ArrayList<UsuarioActivoBean>();
		if(detalleSelected){
			buscar = selectedUsuario;
		}else{
			buscar = validaciones.listaUsuarios;
		}
		
		int i = 0;
		for (UsuarioActivoBean user : buscar) {
			UsuarioActivoBean userActivo = new UsuarioActivoBean();
			FiltrosSQLBean filtroSQL = new FiltrosSQLBean();
			List<Object> valores = new ArrayList<>();
			List<FiltrosBean> filtro = new ArrayList<FiltrosBean>();
			FiltrosBean listaCampo = new FiltrosBean();
			List<String> campo = new ArrayList<String>();
			campo.add("cod_transaccion");
			campo.add("usuario");
			listaCampo.setCampos(campo);
			listaCampo.setOperador("=");
			filtro.add(listaCampo);
			filtroSQL.setListaFiltros(filtro);
			valores.add(user.getCodSession());
			valores.add(user.getUsuarioActivo());
			filtroSQL.setListaValores(valores);

			userActivo.setCodSession(user.getCodSession());
			userActivo.setUsuarioActivo(user.getUsuarioActivo());
			userActivo.setFechaIngreso(user.getFechaIngreso());
			userActivo.setId(user.getId());

			AccesoLogResponse lista = auditoriaSistema.listaAccesoSistema( ObtenerIdTransaccion(), filtroSQL);

			if (lista.getCodigoRespuesta().equals( ConstantesInternasSistema.CODIGO_EXITO)) {
				userActivo.setCiudad(lista.getListaAccesoSistema().get(0).getCiudad());
				userActivo.setPais(lista.getListaAccesoSistema().get(0).getPais());
				validaciones.listaUsuarios.set(i, userActivo);
				System.out.println("Ingresaaaaaa" + i);
				model.addOverlay(new Marker(new LatLng(
						lista.getListaAccesoSistema().get(0).getLatMap(), 
						lista.getListaAccesoSistema().get(0).getLngMap()), 
						lista.getListaAccesoSistema().get(0).getUsuario()
						)
						);
			}
			++i;
		}
		setDetalleSelected(false);
		this.usuariosActivos = validaciones.listaUsuarios;
	}

	public List<UsuarioActivoBean> getUsuariosActivos() {
		return usuariosActivos;
	}

	public void setUsuariosActivos(List<UsuarioActivoBean> usuariosActivos) {
		this.usuariosActivos = usuariosActivos;
	}

	public List<UsuarioActivoBean> getSelectedUsuario() {
		return selectedUsuario;
	}

	public void setSelectedUsuario(List<UsuarioActivoBean> selectedUsuario) {
		this.selectedUsuario = selectedUsuario;
	}

	public OpcionesControlador getOpcionesControlador() {
		return opcionesControlador;
	}

	public void setOpcionesControlador(OpcionesControlador opcionesControlador) {
		this.opcionesControlador = opcionesControlador;
	}

	public MapModel getModel() {
		return model;
	}

	public void setModel(MapModel model) {
		this.model = model;
	}

	public void eliminarSession() {

	}

	public Marker getMarker() {
		return marker;
	}

	public void setMarker(Marker marker) {
		this.marker = marker;
	}

	public Boolean getDetalleSelected() {
		return detalleSelected;
	}

	public void setDetalleSelected(Boolean detalleSelected) {
		this.detalleSelected = detalleSelected;
	}

	@Override
	public void unSelect(UnselectEvent event) {
		opcionesControlador.habilitarControles(selectedUsuario.size());
	}

	@Override
	public void checkSelect(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedUsuario.size());
	}

	@Override
	public void seleccionarItem(SelectEvent event) {
		opcionesControlador.habilitarControles(selectedUsuario.size());
	}

	@Override
	public void dobleSelect(SelectEvent event) {
		setDetalleSelected(true);
		inicializar();
		opcionesControlador.habilitarControles(selectedUsuario.size());
	}

	@Override
	public void nuevoItem() {
		// TODO Auto-generated method stub

	}

	@Override
	public void editItem() {
		// TODO Auto-generated method stub

	}

	@Override
	public void updateInsertItem() {
		// TODO Auto-generated method stub

	}

	@Override
	public String ObtenerIdTransaccion() {
		FacesContext fCtx = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) fCtx.getExternalContext()
				.getSession(false);
		String sessionId = session.getId().replace(".undefined", "");
		return sessionId;
	}

	@Override
	public void guardarItem() {
		// TODO Auto-generated method stub

	}

	@Override
	public void modificarItem() {
		// TODO Auto-generated method stub

	}

	@Override
	public void eliminarItem() {
		try {
			for (UsuarioActivoBean select : selectedUsuario) {
				int i = 0;
				for (UsuarioActivoBean user : usuariosActivos) {
					if (user.getCodSession().equals(select.getCodSession())) {
						validaciones.listaUsuarios.remove(i);
						break;
					}
					++i;
				}
			}
			System.out.println("Numero de Sessiones Activas : "
					+ validaciones.listaUsuarios.size());
		} catch (Exception e) {

			System.out.println("Error al tratar de eliminar Session " + e);
		}

		inicializar();
		opcionesControlador.desactivarControles();
	}

	@Override
	public void actualizarEstado() {
		// TODO Auto-generated method stub

	}
	/*
	 * Metodo para capturar evento sobre marcador*/
	public void onMarkerSelect(OverlaySelectEvent event) {
		this.marker=(Marker) event.getOverlay();

	}

	@Override
	public void limpiarFormulario() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void crearFiltro() {
		// TODO Auto-generated method stub
		
	}
}
